﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using iNet.Collections;
using iNet.Media.Imaging.Png;
using iNet.Media.Xmp;

namespace iNet.Media.Imaging
{
	/// <summary>
	/// PNG 影像中繼資料。
	/// </summary>
	public class PngMetadata : HybridImageMetadata, ITextualMetadata, IXmpMetadata
	{
		#region 建構子
		/// <summary>
		/// 初始化新的 PngMetadata 執行個體。
		/// </summary>
		public PngMetadata()
			: this(null, null, null, false)
		{ }
		/// <summary>
		/// 初始化新的 PngMetadata 執行個體。
		/// </summary>
		/// <param name="template">範本中繼資料。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public PngMetadata(IMetadata template, bool isReadOnly)
			: this(null, null, template, isReadOnly)
		{ }
		/// <summary>
		/// 初始化新的 PngMetadata 執行個體。
		/// </summary>
		/// <param name="textualItems">文字中繼資料項目列表。</param>
		/// <param name="xmpProperties">XMP Property 列表。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public PngMetadata(IEnumerable<TextualMetadataItem> textualItems, IEnumerable<XmpProperty> xmpProperties, bool isReadOnly)
			: this(new PngMetadataBase(textualItems, isReadOnly), new XmpImageMetadata(xmpProperties, isReadOnly), null, isReadOnly)
		{ }
		/// <summary>
		/// 初始化新的 PngMetadata 執行個體。
		/// </summary>
		/// <param name="textualMetadata">提供儲存的文字中繼資料。</param>
		/// <param name="xmpMetadata">提供儲存的 XMP 中繼資料。</param>
		/// <param name="template">範本中繼資料。</param>
		/// <param name="isReadOnly">是否為唯讀。</param>
		public PngMetadata(ITextualMetadata textualMetadata, IXmpMetadata xmpMetadata, IMetadata template, bool isReadOnly)
			: base(new IMetadata[] { textualMetadata, xmpMetadata }, template, isReadOnly)
		{ }
		#endregion
		#region Clone
		/// <summary>
		/// 建立可修改的 PngMetadata 副本。
		/// </summary>
		/// <returns>PngMetadata 副本。</returns>
		public override object Clone()
		{
			return new PngMetadata(this.TextualMetadataItems, this.XmpProperties, false);
		}
		#endregion
		#region GetAsReadOnly
		/// <summary>
		/// 取得唯讀的 PngMetadata。
		/// </summary>
		/// <returns>唯讀的 PngMetadata。</returns>
		public override IMetadata GetAsReadOnly()
		{
			if (this.IsReadOnly)
				return this;
			return new PngMetadata(this.TextualMetadataItems, this.XmpProperties, true);
		}
		#endregion
		#region TextualMetadataItems
		/// <summary>
		/// 取得文字中繼資料項目列表。
		/// </summary>
		public IList<TextualMetadataItem> TextualMetadataItems
		{
			get
			{
				ITextualMetadata metadata = (this.Sources[0] as ITextualMetadata);
				return (metadata != null ? metadata.TextualMetadataItems : new TextualMetadataItem[0]);
			}
		}
		#endregion
		#region XmpProperties
		/// <summary>
		/// 取得原始 XMP Property 集合。
		/// </summary>
		public IList<XmpProperty> XmpProperties
		{
			get
			{
				IXmpMetadata metadata = (this.Sources[1] as IXmpMetadata);
				return (metadata != null ? metadata.XmpProperties : new XmpProperty[0]);
			}
		}
		#endregion
	}
}
